
// 'use strict'

// const test = () => {
//   console.log(this)
// }
// test(); // window

// function test1() {
//   console.log(this)
// }
// test1(); // undefined




var obj = {
  a: 1
}
// var a = 2;

// const test = () => {
//   console.log(this.a);
// }

// test(); // 2
// 箭头函数是忽略任何形式的 this 指向的改变
// 静态 this 指向
// test.call(obj); // 2
// test.apply(obj); // 2
// var test1 = test.bind(obj);
// test1(); // 2

// 箭头函数一定不是构造器
// new test(); // test is not a constructor

// obj.test = () => {
//   // 箭头函数中的this 不是谁绑定指向谁
//   console.log(obj); // {a: 1, test: f }
//   console.log(this); // window
// }

// obj.test = function() {
//   var t = () => {
//     console.log(obj); // {a: 1, test: f }
      // this -> obj
//     console.log(this); // {a: 1, test: ƒ}
//   }
//   t();
// }

// obj.test = () => {
//   var t = () => {
//     console.log(obj); // {a: 1, test: f }
//     // this -> window
//     console.log(this); // window
//   }
//   t();
// }

// obj.test = function() {
//   setTimeout(() => {
//     console.log(obj); // {a: 1, test: f }
//       // this -> obj
//     console.log(this); // {a: 1, test: ƒ}
//   }, 0)
// }

// obj.test = function() {
//   var t1 = () => {
//     var t2 = () => {
//       // this -> obj
//       console.log(this); // {a: 1, test: ƒ}
//     }
//     t2();
//   }
//   t1();
// }

obj.test = function() {
  console.log('test', this); // {a: 1, test: ƒ}
  var t1 = function() {
    console.log('t1', this); // window
    var t2 = () => {
      // this -> window
      console.log('t2', this); // window
    }
    t2();
  }
  t1();
}

// 箭头函数的this -> 外层作用域的this指向(外层的函数不能是箭头函数)

obj.test();